# -*- coding: utf-8 -*-
"""常量定义模块

包含游戏中所有的枚举类型、配置数据和工具函数
"""

from enum import IntEnum
from typing import Any, Dict

# 常量定义
ROUND_LIMIT = 200  # 回合数上限
COMMAND_FAIL_LIMIT = 50  # 命令失败次数上限
INIT_RMB = 200  # 玩家初始经济
SPLASH_DAMAGE_RATIO = 0.5  # 溅射伤害比例


# 枚举定义
class UnitType(IntEnum):
    """单位类型枚举"""

    soldier = 0  # 士兵
    collect = 1  # 采集兵
    doctor = 2  # 治疗兵
    archer = 3  # 弓箭手
    worker = 4  # 建造兵


class TildeType(IntEnum):
    """地块类型枚举"""

    flat = 0  # 平地
    hill = 1  # 山丘
    river = 2  # 河流
    gold = 11  # 黄金矿
    energy = 12  # 能源矿
    wood = 13  # 木材
    stone = 14  # 石材


class BuildingType(IntEnum):
    """建筑类型枚举"""

    base = 0  # 基地
    tower = 1  # 防御塔
    wall = 2  # 城墙


class EntityType(IntEnum):
    """实体类型枚举"""

    unit = 0  # 单位
    building = 1  # 建筑
    terrain = 2  # 地形


class CommandType:
    """命令类型常量"""

    init = 'init'  # 初始化战场
    end = 'end'  # 结束
    move = 'move'  # 移动
    attack = 'attack'  # 攻击
    build = 'build'  # 建造
    swap = 'swap'  # 生产
    heal = 'heal'  # 治疗
    collect = 'collect'  # 采集


class PlayerType:
    """玩家类型常量"""

    PLAYER1 = 'player1'  # 玩家1
    PLAYER2 = 'player2'  # 玩家2
    ADMIN = 'admin'  # 管理员


class DirectionType:
    """方向类型常量"""

    up = [0, -1]  # 向上
    down = [0, 1]  # 向下
    left = [-1, 0]  # 向左
    right = [1, 0]  # 向右


# 单位配置
UNIT_CONFIG = {
    UnitType.soldier: {
        'name': '士兵',          # 名字
        'attack': 30,          # 攻击力
        'speed': 1,          # 移动速度
        'hp': 80,          # 初始血量
        'attackRange': 1,          # 攻击范围
        'cost': 25,          # 生产成本
        'killedAward': 15,          # 被击杀奖励
        'icon': '⚔️',          # 文本小图标
    },
    UnitType.collect: {
        'name': '采集兵',          # 名字
        'attack': 1,          # 采集数量
        'speed': 1,          # 移动速度
        'hp': 40,          # 初始血量
        'attackRange': 1,          # 采集范围
        'cost': 15,          # 生产成本
        'killedAward': 15,          # 被击杀奖励
        'icon': '⛏️',          # 文本小图标
    },
    UnitType.doctor: {
        'name': '治疗兵',          # 名字
        'attack': 10,          # 治疗量
        'speed': 1,          # 移动速度
        'hp': 50,          # 初始血量
        'attackRange': 1,          # 治疗范围
        'cost': 20,          # 生产成本
        'killedAward': 12,          # 被击杀奖励
        'icon': '💊',          # 文本小图标
    },
    UnitType.archer: {
        'name': '弓箭手',          # 名字
        'attack': 20,          # 攻击力
        'speed': 1,          # 移动速度
        'hp': 40,          # 初始血量
        'attackRange': 3,          # 攻击范围
        'cost': 30,          # 生产成本
        'killedAward': 18,          # 被击杀奖励
        'icon': '🏹',          # 文本小图标
    },
    UnitType.worker: {
        'name': '建造兵',          # 名字
        'attack': 1,          # 建筑数量
        'speed': 1,          # 移动速度
        'hp': 50,          # 初始血量
        'attackRange': 1,          # 建造范围
        'cost': 30,          # 生产成本
        'killedAward': 18,          # 被击杀奖励
        'icon': '🪓',          # 文本小图标
    },
}

# 资源配置
RESOURCE_CONFIG = {
    TildeType.energy: {
        'name': '能源',          # 名字
        'value': 3,          # 价值
        'icon': '⚡',          # 文本小图标
    },
    TildeType.wood: {
        'name': '木材',          # 名字
        'value': 2,          # 价值
        'icon': '🌲',          # 文本小图标
    },
    TildeType.stone: {
        'name': '石材',          # 名字
        'value': 2,          # 价值
        'icon': '🧱',          # 文本小图标
    },
    TildeType.gold: {
        'name': '黄金',          # 名字
        'value': 6,          # 价值
        'icon': '💰',          # 文本小图标
    },
}

# 建筑配置
BUILDING_CONFIG = {
    BuildingType.base: {
        'name': '基地',          # 名字
        'attack': 1,          # 攻击力
        'hp': 600,          # 初始血量
        'attackRange': 10,          # 攻击范围
        'cost': 0,          # 建造成本
        'killedAward': 0,          # 被击杀奖励
        'icon': '🕍',          # 文本小图标
    },
    BuildingType.tower: {
        'name': '防御塔',          # 名字
        'attack': 30,          # 攻击力
        'hp': 50,          # 初始血量
        'attackRange': 4,          # 攻击范围
        'cost': 100,          # 建造成本
        'killedAward': 100,          # 被击杀奖励
        'icon': '🗼',          # 文本小图标
    },
    BuildingType.wall: {
        'name': '城墙',          # 名字
        'attack': 0,          # 攻击力
        'hp': 150,          # 初始血量
        'attackRange': 0,          # 攻击范围
        'cost': 200000,          # 建造成本
        'killedAward': 6,          # 被击杀奖励
        'icon': '🌆',          # 文本小图标
    },
}

# 工具函数
def get_unit_config(unit_type: UnitType) -> Dict[str, Any]:
    """获取单位配置"""
    return UNIT_CONFIG.get(unit_type, {})


def get_building_config(building_type: BuildingType) -> Dict[str, Any]:
    """获取建筑配置"""
    return BUILDING_CONFIG.get(building_type, {})


def get_resource_config(resource_type: TildeType) -> Dict[str, Any]:
    """获取资源配置"""
    return RESOURCE_CONFIG.get(resource_type, {})


def is_resource_tilde_type(tilde_type: TildeType) -> bool:
    """判断地块类型是否为资源地形"""
    return tilde_type in [
        TildeType.gold,
        TildeType.energy,
        TildeType.wood,
        TildeType.stone
    ]